package Day011_多线程1.demo03_高并发及线程安全.线程安全;

/**
 * @author zhangyan
 * @date 2020/4/28 12:00
 */
public class demo03_多线程原子性问题 {
    public static void main(String[] args) throws InterruptedException {
        /*
        案例:
            子线程对a变量自增100000
            主线程也对a变量自增100000
        */

        //创建子线程
        MyThread2 mt = new MyThread2();
        mt.start();

        //主线程也对a变量自增100000
        for (int i = 0; i < 100000; i++) {
            MyThread2.a++;
        }

        //保证子线程 主线程都执行完毕,才打印a的值,设定睡眠3秒
        Thread.sleep(3000);

        System.out.println("最终a:" + MyThread2.a);
    }
}
/*
    猜测: a的结果是200000
    实际: a的结果是156897,146563,167358 ...

    原因: 两个线程对共享变量的操作产生了覆盖效果
 */

class MyThread2 extends Thread{
    static int a = 0; //主线程 子线程共享的变量

    @Override
    public void run() {
        //子线程对a变量自增100000
        for (int i = 0; i < 100000; i++) {
            a++;
        }
        System.out.println("子线程执行完毕");
    }
}
